java读取Excel文档 + 存入数据库

您所在的位置:网站首页 java excel导入数据到数据库 java读取Excel文档 + 存入数据库

java读取Excel文档 + 存入数据库

2024-02-28 10:29| 来源: 网络整理| 查看: 265

在做项目的时候,我们有时想要读取Excel类型的文档,把表格里面的数据进行处理,比如把成绩Excel文档存储到数据库对应的表。而这时却不知道该如何操作,接下来我将讲解这个流程。以下面的数据为例

请添加图片描述

总体思路

1、想要读取Excel文件,必须要获得文件的位置,就是文件路径,看看文件在哪个文件夹里,复制文件夹的路径,并在java中定义。

2、获得路径后,通过路径定位生成数据流,使用FileInputStream方法读取路径对应文件的原始字节流。

3、使用ExcelUtils工具类读取 字节流 + 路径。

4、ExcelUtils工具类对数据进行处理,因为表格有行和列,所以处理完数据使用二维集合List对数据进行存储。

5、已经获取到了Excel表格中所有的数据,包含所有的行和列,都在List中,这一步所有的数据获取完了,如果没有将数据存储到数据库的需求,那已经结束了。

6、有了数据,要将数据存储到数据库。

7、需要创建数据库字段的实体类(POJO类),使用@Excel注解将表格和数据库字段名一一对应 请添加图片描述 请添加图片描述

8、通过双重 for循环遍历List,内层List为列,外层List为行,如下图将第一行数据单独拿出来,作为判断字段,如果实体类等@Excel注解属性和Excel表格第一行名字相同,对实体类进行set赋值。如有疑惑,可以结合代码来理解。

请添加图片描述

9、从第二行开始,每遍历完一行,将获得一个实体类对象,因为是结合数据库写的实体类,通过springboot可以直接插入数据库。

10、通过读取成功插入到数据库

请添加图片描述

代码实现及讲解 //fileName可以定位为 String fileName =“你的路径” ,下面这样写是为了上传至服务器,如果感兴趣可以看我的服务器上传讲解 String fileName = "你的路径"; //fileName = filePath + File.separator + fileName; //根据路径生成 FileInputStream字节流 FileInputStream inputStream = new FileInputStream(new File(fileName)); //通过ExcelUtils工具将Excel数据存入到list中,工具代码下面细讲,这一步读取Excel已经完成了,如果不想进行插入数据库操作,可以直接拿着list用啦。 List list = ExcelUtils.getListByExcel(inputStream,fileName); //以上读取Excel完成,list就是数据,下面进行插入数据库的操作 //定义Excel第一行的属性 List firstRows = null; //获取第一行属性 放入firstRows中。 if(list != null && list.size() > 0){ firstRows = list.get(0); } //遍历除第一行以外的Excel表格中的值 for (int i = 1; i //某一行的某一列 j为列的坐标 String cellVal = (String) rows.get(j); //对实体类进行赋值,使用setFieldValueByFieldName方法,下面详细讲代码 TestExcel.setFieldValueByFieldName(questionBank, firstRows.get(j).toString().trim(), cellVal); } } // 使用spring插入到数据库 questionBankService.save(questionBank); } ExcelUtils工具类代码及讲解

下面是读取excel的工具类,可以自己在目录中建立这个类并把代码复制过去,我们使用的是ExcelUtils.getListByExcel方法,遍历所有的行和列并用List list存储。内层List是列,外层List是行

public class ExcelUtils { private final static String excel2003L =".xls"; //2003- 版本的excel private final static String excel2007U =".xlsx"; //2007版本 /** * @Description:获取IO流中的数据,组装成List对象 * @param in,fileName * @return * @throws */ public static List getListByExcel(InputStream in, String fileName) throws Exception{ List list = null; //创建Excel工作薄 Workbook work = getWorkbook(in,fileName); if(null == work){ throw new Exception("创建Excel工作薄为空!"); } Sheet sheet = null; //页数 Row row = null; //行数 Cell cell = null; //列数 list = new ArrayList(); //遍历Excel中所有的sheet for (int i = 0; i continue;} //遍历当前sheet中的所有行 for (int j = sheet.getFirstRowNum(); j continue;} //遍历所有的列 List li = new ArrayList(); for (int y = row.getFirstCellNum(); y Workbook wb = null; String fileType = fileName.substring(fileName.lastIndexOf(".")); if(excel2003L.equals(fileType)){ wb = new HSSFWorkbook(inStr); //2003- }else if(excel2007U.equals(fileType)){ wb = new XSSFWorkbook(inStr); //2007+ }else{ throw new Exception("解析的文件格式有误!"); } return wb; } /** * @Description:对表格中数值进行格式化 * @param cell * @return */ //解决excel类型问题,获得数值 public static String getValue(Cell cell) { String value = ""; if(null==cell){ return value; } switch (cell.getCellType()) { //数值型 case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { //如果是date类型则 ,获取该cell的date值 Date date = DateUtil.getJavaDate(cell.getNumericCellValue()); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); value = format.format(date);; }else {// 纯数字 BigDecimal big=new BigDecimal(cell.getNumericCellValue()); value = big.toString(); //解决1234.0 去掉后面的.0 if(null!=value&&!"".equals(value.trim())){ String[] item = value.split("[.]"); if(1// 如果获取的数据值为非法值,则转换为获取字符串 value = cell.getStringCellValue(); } break; // 布尔类型 case BOOLEAN: value = " "+ cell.getBooleanCellValue(); break; default: value = cell.getStringCellValue(); } if("null".endsWith(value.trim())){ value=""; } return value; } }

上面的TestExcel.setFieldValueByFieldName(questionBank, firstRows.get(j).toString().trim(), cellVal)代码讲解,

对Excel每一行中的所有值执行这个方法,可以判断每个值是否与注解的字段对应,如果对应,进行类型判断,并且赋值。

public class TestExcel { /** * 用反射方法,获取列名,比较,为属性赋值 * @param object * @param fieldName * @param val */ public static void setFieldValueByFieldName(Object object, String fieldName, Object val) { try { //通过反射获取所有实体类所有定义的方法,object为数据库实体类 Field[] fields = object.getClass().getDeclaredFields(); //遍历fields for (int i = 0; i if(fieldName.equals(field.getName())){ if(field.getType() == Integer.class){ field.set(object, Integer.valueOf(val.toString())); }else if(field.getType() == Long.class){ field.set(object, Long.valueOf(val.toString())); }else { field.set(object, val); } return; } }else {//设置了注解,并且表格里的Excel字段值和注解的name值相同,则为相应字段赋值 if(fieldName.equals(annotation.name())){ //进行类型判断,因为实体类中变量类型不同。 if(field.getType() == Integer.class){ field.set(object, Integer.valueOf(val.toString())); }else if(field.getType() == Long.class){ field.set(object, Long.valueOf(val.toString())); }else { field.set(object, val); } return; } } } }catch (Exception e){ e.printStackTrace(); } } }

实体类代码,通过反射获取fields列表,fields为每一个变量如id、questionId、screenShare等,通过读取注解@Excel获得name值如序号、题目ID、屏幕共享等,这些注解和表格的第一行一一对应,通过上面的遍历为变量赋值,最终获取已经Set好值得实体类,使用springboot直接save到数据库里。

@Data @TableName("t_question_bank")//数据库名字 public class QuestionBank { @TableId(type = IdType.AUTO) @Excel(name = "序号", cellType = Excel.ColumnType.NUMERIC) private Long id; @Excel(name = "题目ID") private Long questionId; @Excel(name = "屏幕共享") private String screenShare; @Excel(name = "试题") private String question; @Excel(name = "答案") private String answer; @Excel(name = "评分标准") private String scoreCriteria; }

经过这样的操作,读取Excel文档 + 存入数据库的功能已经实现啦



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3